package zpe.controledeacesso.security;


import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import zpe.controledeacesso.model.bean.Permissoes;
import zpe.genericcrud.exception.ApplicationException;
import zpe.genericcrud.util.PropertiesUtils;

public class Acesso implements Serializable{

	private static final long serialVersionUID = -7051862630804046345L;
	
	private String transacao;
	private Map<String, Permissoes> permissoes = new HashMap<String, Permissoes>();

	/**Local onde fica o arquivo properties de configuração do módulo.*/
	public static final String filePermissoes = "/conf.properties";
	public static final String filePages = "/pages.properties";

	public Acesso( Map<String, Permissoes> permissoes ) {
		configuraPermissoes( permissoes );
	}

	public void configuraPermissoes( Map<String, Permissoes> permissoes ){		
		if( permissoes != null ){
			this.permissoes = permissoes;
		}
	}

	public static int getModuloSistema(){
		//Pega o id do módulo do sistema
		return Integer.parseInt( ( (String)PropertiesUtils.getValueProperty( Acesso.filePermissoes, "MODULO" ) ).trim() );
	}
	
	public static String[] getPagesNoFilter(){
		String noFilter = PropertiesUtils.getValueProperty( Acesso.filePermissoes, "NO_FILTER" );
		if( noFilter == null )
			return null;		
		return noFilter.split( "," );
	}
	
	public static String[] getDirectoriesNoFilter(){
		String noFilter = PropertiesUtils.getValueProperty( Acesso.filePermissoes, "DIR_NO_FILTER" );
		if( noFilter == null )
			return null;		
		return noFilter.split( "," );
	}
	
	public static String getLoginPage(){
		String login = PropertiesUtils.getValueProperty( Acesso.filePermissoes, "LOGIN" );
		return login != null ? login.trim() : null;
	}
	
	public static String getHomePage(){
		String home = PropertiesUtils.getValueProperty( Acesso.filePermissoes, "HOME" );
		return home != null ? home.trim() : null;
	}
	
	public static String getKeyPage( String pagina ){
		String chave = PropertiesUtils.getValueProperty( Acesso.filePages, pagina );
		return chave != null ? chave.trim() : null;
	}
	
	public static Properties getPages(){
		PropertiesUtils p = new PropertiesUtils();
		Properties prop = p.getProperties( Acesso.filePages );
		return prop;
	}
	
	/**
	 * Função p/ liberar as permissões de acesso
	 * 
	 * @param transacao
	 * @param editar
	 * @param delete
	 * @param inserir
	 * @return
	 */
	public boolean isPermissao() {		
		if( transacao == null )
			throw new IllegalArgumentException( "Transação não informada." );

		Permissoes p = permissoes.get( transacao );
		if( p != null ){
			return true;
		}
		return false;
	}

	/**
	 * Informa se a uma operação básica é permitida para a transação.
	 * @param tipo
	 * @return
	 */
	public boolean isOpcaoPermitida(int tipo) {
		if( transacao == null )
			throw new IllegalArgumentException( "Transação não informada." );

		Permissoes p = permissoes.get( transacao );

		if( p != null ){
			if (tipo == 1)
				return p.isAtivoBool();
			if (tipo == 2)
				return p.isEditableBool();
			if (tipo == 3)
				return p.isRemoveBool();
		}
		return false;
	}

	/**
	 * Informa se tem permissão de inserir. na transação.
	 * @return
	 */
	public boolean isInsert() {
		return isOpcaoPermitida(1);
	}

	/**
	 * Informa se tem permissão de atualizar, na transação.
	 * @return
	 */
	public boolean isUpdate() {
		return isOpcaoPermitida(2);
	}

	/**
	 * Informa se tem permissão de remover, na transação.
	 * @return
	 */
	public boolean isRemove() {
		return isOpcaoPermitida(3);
	}
	
	/**
	 * Monta um mapa com as permissões do módulo.
	 * @return
	 */
	public Map<String, Acesso> mapeiaPermissoes(){
		Map<String, Acesso> mapa = new HashMap<String, Acesso>();
		if( permissoes == null ){
			throw new ApplicationException( "Permissões não informadas." );
		}
		for( Permissoes p : permissoes.values() ){
			String chaveTransacao = p.getTransacao().getUsedLabel();
			Acesso a = new Acesso( permissoes );			
			a.setTransacao( chaveTransacao );
			mapa.put( chaveTransacao, a );
		}				
		return mapa;
	}
	
	public String getTransacao() {
		return transacao;
	}

	public void setTransacao(String transacao) {
		this.transacao = transacao;
	}
}
